/**
 * ControladoraBDDocenteImparte.java
 */

/**
 *  AdSec: Administrador de Secundarias
 *  Copyright (C) 2009 Daniela Ramírez Chaves (dannyrch@gmail.com)
 *  Copyright (C) 2009 Leonel Salazar Valverde (leo87sv@gmail.com)
 *
 *  This file is part of AdSec.
 *  AdSec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  AdSec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with AdSec.  If not, see <http://www.gnu.org/licenses/>.
 */

package adsec.datos;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.util.Iterator;
import java.util.LinkedList;
import adsec.entidades.Docente;
import adsec.entidades.Materia;
import adsec.entidades.MateriaCursada;
import adsec.entidades.MateriaImpartida;
import adsec.entidades.Seccion;


public class ControladoraBDDocenteImparte {

    private Connection conexion;
    private AdministradorConexion adminConexion;

    public ControladoraBDDocenteImparte() {
        adminConexion = AdministradorConexion.getInstancia();
    }

    public LinkedList<MateriaImpartida> consultarMateriasImparte(String cedula, int año) {
        LinkedList<MateriaImpartida> lista = new LinkedList<MateriaImpartida>();
        conexion = adminConexion.getConexion();
        if (conexion != null) {
            CallableStatement procedimiento = this.spConsultarMateriasImparte(conexion, cedula, año);
            if (procedimiento != null) {
                try {
                    procedimiento.execute();
                    ResultSet resultado = procedimiento.getResultSet();
                    while (resultado.next()) {
                        MateriaImpartida materiaImp = this.crearMateriaImpartidaGrid(resultado);
                        lista.add(materiaImp);
                    }//fin de while
                } catch (SQLException e) {
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return lista;
    }//fin de consultarDocentes

    public int actualizarDocenteImparte(LinkedList<MateriaImpartida> listaMateriaImpartida) {
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if (conexion != null) {
            Iterator<MateriaImpartida> iterador = listaMateriaImpartida.iterator();
            while(iterador.hasNext()){
                MateriaImpartida materiaImpartida = iterador.next();
                CallableStatement procedimiento = this.spActualizarDocenteImparte(conexion, materiaImpartida);
                if (procedimiento != null) {
                    try {
                        procedimiento.execute();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }//fin de try catch
                }//fin de if
            }//fin de while
            resultado = AdministradorConexion.QUERY_OK;
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }//fin de actualizarDocenteImparte


    public Docente consultarDatosDocenteImparte(Seccion seccion, MateriaCursada materia){
        Docente docente = new Docente();
        conexion = adminConexion.getConexion();
        if (conexion != null) {
            CallableStatement procedimiento = this.spConsultarCedulaDocenteImparte(conexion, seccion, materia);
            if (procedimiento != null) {
                try {
                    procedimiento.execute();
                    ResultSet resultado = procedimiento.getResultSet();
                    if(resultado.next()){                        
                        docente.setCedula(resultado.getString(Docente.cedulaNC));
                        docente.setNombre(resultado.getString(Docente.nombreNC));
                        docente.setApellidos(resultado.getString(Docente.apellidosNC));
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return docente;
    }//fin de consultarDatosDocenteImparte

    public int eliminarDocenteImparte(String cedula, int año) {
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if (conexion != null) {
            CallableStatement procedimiento = this.spEliminarDocenteImparte(conexion, cedula, año);
            if (procedimiento != null) {
                try {
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                } catch (SQLException e) {
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }//fin de eliminarDocenteImparte


    private CallableStatement spConsultarMateriasImparte(Connection conexion, String cedula, int año) {
        CallableStatement procedimiento = null;
        try {
            procedimiento = conexion.prepareCall("CALL consultarMateriasImparte" + UtilidadesCapaDatos.agregarParametros(2),
                    ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(MateriaImpartida.cedulaNC + "_p", cedula);
            procedimiento.setInt(MateriaImpartida.añoNC + "_p", año);
        } catch (SQLException sqlException) {
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spConsultarMateriasImparte

    private CallableStatement spActualizarDocenteImparte(Connection conexion, MateriaImpartida materiaImpartida) {
        CallableStatement procedimiento = null;
        try {
            procedimiento = conexion.prepareCall("CALL actualizarDocenteImparte" + UtilidadesCapaDatos.agregarParametros(6),
                    ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(MateriaImpartida.cedulaNC + "_p", materiaImpartida.getCedula());
            procedimiento.setInt(MateriaImpartida.añoNC + "_p", materiaImpartida.getAño());
            procedimiento.setInt(MateriaImpartida.nivelNC + "_p", materiaImpartida.getNivel());
            procedimiento.setInt(MateriaImpartida.numSeccionNC + "_p", materiaImpartida.getNumSeccion());
            procedimiento.setInt(MateriaImpartida.idMateriaNC + "_p", materiaImpartida.getIdMateria());
            procedimiento.setInt(MateriaImpartida.idMateriaCursadaNC + "_p", materiaImpartida.getIdMateriaCursada());
        } catch (SQLException sqlException) {
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spActualizarDocenteImparte

    private CallableStatement spEliminarDocenteImparte(Connection conexion, String cedula, int año) {
        CallableStatement procedimiento = null;
        try {
            procedimiento = conexion.prepareCall("CALL eliminarDocenteImparte" + UtilidadesCapaDatos.agregarParametros(2),
                    ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(MateriaImpartida.cedulaNC + "_p", cedula);
            procedimiento.setInt(MateriaImpartida.añoNC + "_p", año);
        } catch (SQLException sqlException) {
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spEliminarDocenteImparte

    private CallableStatement spConsultarCedulaDocenteImparte(Connection conexion, Seccion seccion, MateriaCursada materia){
        CallableStatement procedimiento = null;
        try {
            procedimiento = conexion.prepareCall("CALL consultarDatosDocenteImparte" + UtilidadesCapaDatos.agregarParametros(5),
                    ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setInt(Seccion.anioNC + "_p", seccion.getAnio());
            procedimiento.setInt(Seccion.nivelNC + "_p", seccion.getNivel());
            procedimiento.setInt(Seccion.seccionNC + "_p", seccion.getSeccion());
            procedimiento.setInt(MateriaCursada.idMateriaNC + "_p", materia.getIdMateria());
            procedimiento.setInt(MateriaCursada.idMateriaCursadaNC + "_p", materia.getIdMateriaCursada());
        } catch (SQLException sqlException) {
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spConsultarCedulaDocenteImparte

    private MateriaImpartida crearMateriaImpartidaGrid(ResultSet resultSet) throws SQLException {
        MateriaImpartida materiaImp = new MateriaImpartida();
        materiaImp.setIdMateria(resultSet.getInt(MateriaImpartida.idMateriaNC));
        materiaImp.setIdMateriaCursada(resultSet.getInt(MateriaImpartida.idMateriaCursadaNC));
        materiaImp.setNivel(resultSet.getInt(MateriaImpartida.nivelNC));
        materiaImp.setNumSeccion(resultSet.getInt(MateriaImpartida.numSeccionNC));
        materiaImp.setNombre(resultSet.getString(Materia.nombreNC));
        materiaImp.setImpartida(true);
        return materiaImp;
    }//fin de crearMateriaImpartidaGrid
}//fin de la clase ControladoraBDDocente
